
namespace ShoppingCart.WebSite.Admin
{
    using System;
    using System.Linq;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Business.Entity.Collections;
    using Business.Logic;
    using Code;
    using DTO = Business.Entity;

    public partial class Banco : BasePage
    {
        private static CuentaCollection _cuentas;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack) return;
            CargarAccion();
        }

        protected void LvCuentasItemCommand(object sender, ListViewCommandEventArgs e)
        {
            switch (e.CommandName)
            {
                case "Insert":
                    AgregarCuenta(e.Item);
                    break;
                case "Update":
                    ModificarCuenta(e.CommandArgument.ToString(), e.Item);
                    break;
                case "Delete":
                    EliminarCuenta(e.CommandArgument.ToString());
                    break;
            }
        }

        protected void LvCuentasItemEditing(object sender, ListViewEditEventArgs e)
        {
            lvCuentas.EditIndex = e.NewEditIndex;
            BindControl<DTO.Cuenta>.BindListView(lvCuentas, _cuentas);
        }

        protected void LvCuentasItemCanceling(object sender, ListViewCancelEventArgs e)
        {
            switch (e.CancelMode)
            {
                case ListViewCancelMode.CancelingEdit:
                case ListViewCancelMode.CancelingInsert:
                    lvCuentas.EditIndex = -1;
                    break;
                default:
                    break;
            }
            BindControl<DTO.Cuenta>.BindListView(lvCuentas, _cuentas);
        }

        protected void LvCuentasItemDeleting(object sender, ListViewDeleteEventArgs e)
        {
            // Sin codigo evitando la actualización por defecto
        }

        protected void LvCuentasItemUpdating(object sender, ListViewUpdateEventArgs e)
        {
            // Sin codigo evitando la actualización por defecto
        }

        protected void LvCuentasItemInserting(object sender, ListViewInsertEventArgs e)
        {
            // Sin codigo evitando la actualización por defecto
        }

        protected void BtnGuardarClick(object sender, EventArgs e)
        {
            GuardarAccion();
        }

        private void AgregarCuenta(ListViewItem item)
        {
            var numero = ((TextBox)item.FindControl("txtNumero")).Text;
            var cuenta = _cuentas.Where(p => p.Numero == numero).SingleOrDefault();
            if (cuenta == null)
            {
                _cuentas.Add(new DTO.Cuenta
                    {
                        Numero = numero,
                        Tipo = Convert.ToByte(((DropDownList)item.FindControl("ddlMonedas")).SelectedValue)
                    });
            }
            else
            {
                ScriptManager.RegisterStartupScript(upCuentas, GetType(), "Mensaje", "alert('Ya existe este número de cuenta.');", true);
            }
            lvCuentas.EditIndex = -1;
            BindControl<DTO.Cuenta>.BindListView(lvCuentas, _cuentas);
        }

        private void ModificarCuenta(string numero, ListViewItem item)
        {
            var cuenta = _cuentas.Where(p => p.Numero == numero).SingleOrDefault();
            cuenta.Numero = ((TextBox)item.FindControl("txtNumero")).Text;
            cuenta.Tipo = Convert.ToByte(((DropDownList)item.FindControl("ddlMonedas")).SelectedValue);
            lvCuentas.EditIndex = -1;
            BindControl<DTO.Cuenta>.BindListView(lvCuentas, _cuentas);
        }

        private void EliminarCuenta(string numero)
        {
            var cuenta = _cuentas.Where(p => p.Numero == numero).Single();
            _cuentas.Remove(cuenta);
            BindControl<DTO.Cuenta>.BindListView(lvCuentas, _cuentas);
        }

        private void CargarAccion()
        {
            var accion = Request.QueryString.Get("Accion");
            if (string.IsNullOrEmpty(accion))
                Response.Redirect("Bancos.aspx", true);

            _cuentas = new CuentaCollection();
            switch (accion)
            {
                case "I":
                    litAccion.Text = @"INGRESAR";
                    break;
                case "M":
                    var idBanco = Convert.ToInt32(Request.QueryString.Get("idBanco"));
                    CargarBanco(idBanco);
                    litAccion.Text = @"MODIFICAR";
                    break;
            }
            BindControl<DTO.Cuenta>.BindListView(lvCuentas, _cuentas);
        }

        private void CargarBanco(int idBanco)
        {
            var entidad = BancoManager.Instancia.Obtener(idBanco);
			txtNombre.Text = entidad.Nombre;
			txtDescripcion.Text = entidad.Descripcion;
            _cuentas = entidad.Cuentas;
        }

        private void GuardarAccion()
        {
            var accion = Request.QueryString.Get("Accion");
            switch (accion)
            {
                case "I":
                    InsertarBanco();
                    break;
                case "M":
                    ModificarBanco();
                    break;
            }
        }

        private void InsertarBanco()
        {
            var entidad = new DTO.Banco
            {
				Nombre = txtNombre.Text,
				Descripcion = txtDescripcion.Text,
                Cuentas = _cuentas
            };
            try
            {
                BancoManager.Instancia.Agregar(entidad);
                ClientScript.RegisterStartupScript(GetType(), "mostrar1", "alert('Registro grabado satisfactoriamente');window.location = 'Bancos.aspx';", true);
            }
            catch
            {
                ClientScript.RegisterStartupScript(GetType(), "mostrar1", "alert('No se pudo Agregar el Banco, por favor intentelo de nuevo o mas tarde.');", true);
            }
        }

        private void ModificarBanco()
        {
            var idBanco = Convert.ToInt32(Request.QueryString.Get("idBanco"));
            var entidad = BancoManager.Instancia.Obtener(idBanco);
            
			entidad.Nombre = txtNombre.Text;
			entidad.Descripcion = txtDescripcion.Text;
            entidad.Cuentas = _cuentas;
            
            try
            {
                BancoManager.Instancia.Modificar(entidad);
                ClientScript.RegisterStartupScript(GetType(), "mostrar2", "alert('Registro grabado satisfactoriamente');window.location = 'Bancos.aspx';", true);
            }
            catch
            {
                ClientScript.RegisterStartupScript(GetType(), "mostrar1", "alert('No se pudo Modificar Banco, por favor intentelo de nuevo o mas tarde.');", true);
            }
        }
    }
}
